package com.feng.oauth2jwt.oauth.infrastructure.jdbc;



import com.feng.oauth2jwt.oauth.domain.oauth.OauthClientDetails;
import com.feng.oauth2jwt.oauth.domain.oauth.OauthRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 2015/11/16
 *
 */
@Repository("oauthRepositoryJdbc")
public class OauthRepositoryJdbc implements OauthRepository {


    private static OauthClientDetailsRowMapper oauthClientDetailsRowMapper = new OauthClientDetailsRowMapper();


    @Autowired
    private JdbcTemplate jdbcTemplate;


    @Override
    public OauthClientDetails findOauthClientDetails(String clientId) {
        final String sql = " select * from oauth_client_details where  client_id = ? ";
        final List<OauthClientDetails> list = this.jdbcTemplate.query(sql, new Object[]{clientId}, oauthClientDetailsRowMapper);
        return list.isEmpty() ? null : list.get(0);
    }

    @Override
    public List<OauthClientDetails> findAllOauthClientDetails() {
        final String sql = " select * from oauth_client_details order by create_time desc ";
        return this.jdbcTemplate.query(sql, oauthClientDetailsRowMapper);
    }
    @Override
    public void updateOauthClientDetailsArchive(String clientId, boolean archive) {
        final String sql = " update oauth_client_details set archived = ? where client_id = ? ";
        this.jdbcTemplate.update(sql, archive, clientId);
    }
    @Override
    public void saveOauthClientDetails(final OauthClientDetails clientDetails) {
        final String sql = " insert into oauth_client_details(client_id,resource_ids,client_secret,scope,authorized_grant_types,web_server_redirect_uri," +
                " authorities,access_token_validity,refresh_token_validity,additional_information,trusted,autoapprove) values (?,?,?,?,?,?,?,?,?,?,?,?)";
        this.jdbcTemplate.update(sql,clientDetails.clientId(),clientDetails.resourceIds(),clientDetails.clientSecret(),
                clientDetails.scope(),
                clientDetails.authorizedGrantTypes(),
                clientDetails.webServerRedirectUri(),
                clientDetails.authorities(),
                clientDetails.accessTokenValidity() ,
                clientDetails.refreshTokenValidity() , clientDetails.additionalInformation() , clientDetails.trusted() , clientDetails.autoApprove());
    }
    @Override
    public int queryOauthAccessTokenCount(String username){
        final String sql = "select count(1) from oauth_access_token where user_name = ? ";
        final Integer count = this.jdbcTemplate.queryForObject(sql, new Object[]{username},Integer.class);
        return count;
    }

    @Override
    public void deleteOauthAccessTokenCount(String username) {
        this.jdbcTemplate.update("delete from oauth_access_token where user_name = ?",new Object[]{username});
    }
}
